路由和中间件

在构建Web应用程序时,路由和中间件是两个核心概念。路由决定了如何处理客户端的请求,而中间件则是在请求和响应之间执行的函数。本教程将详细介绍这两个概念,并通过代码示例和实践练习帮助你理解和掌握它们。

1. 路由(Routing)

1.1 什么是路由?

路由是指根据请求的URL路径和HTTP方法(如GET、POST等)来决定如何处理请求的过程。在Express.js中,路由是通过定义路径和处理函数来实现的。

1.2 基本路由示例

以下是一个简单的路由示例,展示了如何处理不同的HTTP请求:

const express = require('express');
const app = express();

// 处理GET请求
app.get('/', (req, res) => {
  res.send('Hello World!');
});

// 处理POST请求
app.post('/submit', (req, res) => {
  res.send('Data submitted successfully!');
});

// 启动服务器
app.listen(3000, () => {
  console.log('Server is running on http://localhost:3000');
});

1.3 路由参数

路由参数允许你在路径中捕获动态值。例如,你可以通过路由参数获取用户ID:

app.get('/user/:id', (req, res) => {
  res.send(`User ID: ${req.params.id}`);
});

1.4 路由模块化

为了保持代码的整洁和可维护性,你可以将路由拆分为多个模块。以下是一个示例:

// userRoutes.js
const express = require('express');
const router = express.Router();

router.get('/:id', (req, res) => {
  res.send(`User ID: ${req.params.id}`);
});

module.exports = router;

// app.js
const express = require('express');
const app = express();
const userRoutes = require('./userRoutes');

app.use('/user', userRoutes);

app.listen(3000, () => {
  console.log('Server is running on http://localhost:3000');
});

2. 中间件(Middleware)

2.1 什么是中间件?

中间件是在请求和响应之间执行的函数。它可以访问请求对象(req)、响应对象(res)以及应用程序的下一个中间件函数(next)。中间件可以用于执行各种任务,如日志记录、身份验证、请求处理等。

2.2 基本中间件示例

以下是一个简单的中间件示例,用于记录请求的URL:

const express = require('express');
const app = express();

app.use((req, res, next) => {
  console.log(`Request URL: ${req.url}`);
  next();
});

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(3000, () => {
  console.log('Server is running on http://localhost:3000');
});

2.3 中间件的类型

Express.js支持多种类型的中间件:

  • 应用级中间件:绑定到app对象,适用于整个应用程序。
  • 路由级中间件:绑定到router对象,适用于特定的路由。
  • 错误处理中间件:专门用于处理错误。
  • 内置中间件:如express.static用于提供静态文件。
  • 第三方中间件:如body-parser用于解析请求体。

2.4 错误处理中间件

错误处理中间件通常有四个参数:err、req、res和next。以下是一个示例:

app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).send('Something broke!');
});

3. 实践练习

3.1 创建一个简单的博客系统

在这个练习中,你将创建一个简单的博客系统,包含以下功能:

  • 显示所有博客文章(GET /posts)
  • 显示单篇博客文章(GET /posts/:id)
  • 创建新的博客文章(POST /posts)

3.2 代码示例

const express = require('express');
const app = express();
app.use(express.json());

let posts = [
  { id: 1, title: 'First Post', content: 'This is the first post.' },
  { id: 2, title: 'Second Post', content: 'This is the second post.' }
];

app.get('/posts', (req, res) => {
  res.json(posts);
});

app.get('/posts/:id', (req, res) => {
  const post = posts.find(p => p.id === parseInt(req.params.id));
  if (!post) return res.status(404).send('Post not found');
  res.json(post);
});

app.post('/posts', (req, res) => {
  const post = {
    id: posts.length + 1,
    title: req.body.title,
    content: req.body.content
  };
  posts.push(post);
  res.status(201).json(post);
});

app.listen(3000, () => {
  console.log('Server is running on http://localhost:3000');
});

3.3 练习步骤

  1. 创建一个新的Express.js项目。
  2. 定义路由以处理博客文章的获取、显示和创建。
  3. 使用Postman或其他工具测试API。

4. 总结

通过本教程,你已经学习了路由和中间件的基本概念和用法。路由帮助你定义如何处理不同的请求,而中间件则允许你在请求和响应之间执行各种任务。通过实践练习,你进一步巩固了这些知识,并能够创建一个简单的博客系统。

继续探索Express.js和其他相关主题,如模板引擎、RESTful API设计和身份认证,将帮助你构建更复杂和功能丰富的Web应用程序。